home *** CD-ROM | disk | FTP | other *** search
/ InterCD 2000 September / september_2000.iso / intercd / root / ^Linux / cdrtools-1.10 / libhfs_iso / record.c < prev    next >
Encoding:
C/C++ Source or Header  |  2000-04-26  |  16.3 KB  |  576 lines

  1. /*
  2.  * hfsutils - tools for reading and writing Macintosh HFS volumes
  3.  * Copyright (C) 1996, 1997 Robert Leslie
  4.  *
  5.  * This program is free software; you can redistribute it and/or modify
  6.  * it under the terms of the GNU General Public License as published by
  7.  * the Free Software Foundation; either version 2 of the License, or
  8.  * (at your option) any later version.
  9.  *
  10.  * This program is distributed in the hope that it will be useful,
  11.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.  * GNU General Public License for more details.
  14.  *
  15.  * You should have received a copy of the GNU General Public License
  16.  * along with this program; if not, write to the Free Software
  17.  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18.  */
  19.  
  20. #include <mconfig.h>
  21. #include <stdxlib.h>
  22. #include <strdefs.h>
  23. #include <errno.h>
  24.  
  25. #include "internal.h"
  26. #include "data.h"
  27. #include "record.h"
  28.  
  29. /*
  30.  * NAME:    record->packcatkey()
  31.  * DESCRIPTION:    pack a catalog record key
  32.  */
  33. void r_packcatkey(key, pkey, len)
  34.     CatKeyRec    *key;
  35.     unsigned char    *pkey;
  36.     int        *len;
  37. {
  38.   unsigned char *start = pkey;
  39.  
  40.   d_storeb(&pkey, key->ckrKeyLen);
  41.   d_storeb(&pkey, key->ckrResrv1);
  42.   d_storel(&pkey, key->ckrParID);
  43.   d_stores(&pkey, key->ckrCName, sizeof(key->ckrCName));
  44.  
  45.   if (len)
  46.     *len = HFS_RECKEYSKIP(start);
  47. }
  48.  
  49. /*
  50.  * NAME:    record->unpackcatkey()
  51.  * DESCRIPTION:    unpack a catalog record key
  52.  */
  53. void r_unpackcatkey(pkey, key)
  54.     unsigned char    *pkey;
  55.     CatKeyRec    *key;
  56. {
  57.   d_fetchb(&pkey, (char *) &key->ckrKeyLen);
  58.   d_fetchb(&pkey, (char *) &key->ckrResrv1);
  59.   d_fetchl(&pkey, (long *) &key->ckrParID);
  60.   d_fetchs(&pkey, key->ckrCName, sizeof(key->ckrCName));
  61. }
  62.  
  63. /*
  64.  * NAME:    record->packextkey()
  65.  * DESCRIPTION:    pack an extents record key
  66.  */
  67. void r_packextkey(key, pkey, len)
  68.     ExtKeyRec    *key;
  69.     unsigned char    *pkey;
  70.     int        *len;
  71. {
  72.   unsigned char *start = pkey;
  73.  
  74.   d_storeb(&pkey, key->xkrKeyLen);
  75.   d_storeb(&pkey, key->xkrFkType);
  76.   d_storel(&pkey, key->xkrFNum);
  77.   d_storew(&pkey, key->xkrFABN);
  78.  
  79.   if (len)
  80.     *len = HFS_RECKEYSKIP(start);
  81. }
  82.  
  83. /*
  84.  * NAME:    record->unpackextkey()
  85.  * DESCRIPTION:    unpack an extents record key
  86.  */
  87. void r_unpackextkey(pkey, key)
  88.     unsigned char    *pkey;
  89.     ExtKeyRec    *key;
  90. {
  91.   d_fetchb(&pkey, (char *) &key->xkrKeyLen);
  92.   d_fetchb(&pkey, (char *) &key->xkrFkType);
  93.   d_fetchl(&pkey, (long *) &key->xkrFNum);
  94.   d_fetchw(&pkey, (short *) &key->xkrFABN);
  95. }
  96.  
  97. /*
  98.  * NAME:    record->comparecatkeys()
  99.  * DESCRIPTION:    compare two (packed) catalog record keys
  100.  */
  101. int r_comparecatkeys(pkey1, pkey2)
  102.     unsigned char    *pkey1;
  103.     unsigned char    *pkey2;
  104. {
  105.   CatKeyRec key1;
  106.   CatKeyRec key2;
  107.   int diff;
  108.  
  109.   r_unpackcatkey(pkey1, &key1);
  110.   r_unpackcatkey(pkey2, &key2);
  111.  
  112.   diff = key1.ckrParID - key2.ckrParID;
  113.   if (diff)
  114.     return diff;
  115.  
  116.   return d_relstring(key1.ckrCName, key2.ckrCName);
  117. }
  118.  
  119. /*
  120.  * NAME:    record->compareextkeys()
  121.  * DESCRIPTION:    compare two (packed) extents record keys
  122.  */
  123. int r_compareextkeys(pkey1, pkey2)
  124.     unsigned char    *pkey1;
  125.     unsigned char    *pkey2;
  126. {
  127.   ExtKeyRec key1;
  128.   ExtKeyRec key2;
  129.   int diff;
  130.  
  131.   r_unpackextkey(pkey1, &key1);
  132.   r_unpackextkey(pkey2, &key2);
  133.  
  134.   diff = key1.xkrFNum - key2.xkrFNum;
  135.   if (diff)
  136.     return diff;
  137.  
  138.   diff = (unsigned char) key1.xkrFkType -
  139.          (unsigned char) key2.xkrFkType;
  140.   if (diff)
  141.     return diff;
  142.  
  143.   return key1.xkrFABN - key2.xkrFABN;
  144. }
  145.  
  146. /*
  147.  * NAME:    record->packcatdata()
  148.  * DESCRIPTION:    pack catalog record data
  149.  */
  150. void r_packcatdata(data, pdata, len)
  151.     CatDataRec    *data;
  152.     unsigned char    *pdata;
  153.     int        *len;
  154. {
  155.   unsigned char *start = pdata;
  156.   int i;
  157.  
  158.   d_storeb(&pdata, data->cdrType);
  159.   d_storeb(&pdata, data->cdrResrv2);
  160.  
  161.   switch (data->cdrType)
  162.     {
  163.     case cdrDirRec:
  164.       d_storew(&pdata, data->u.dir.dirFlags);
  165.       d_storew(&pdata, data->u.dir.dirVal);
  166.       d_storel(&pdata, data->u.dir.dirDirID);
  167.       d_storel(&pdata, data->u.dir.dirCrDat);
  168.       d_storel(&pdata, data->u.dir.dirMdDat);
  169.       d_storel(&pdata, data->u.dir.dirBkDat);
  170.  
  171.       d_storew(&pdata, data->u.dir.dirUsrInfo.frRect.top);
  172.       d_storew(&pdata, data->u.dir.dirUsrInfo.frRect.left);
  173.       d_storew(&pdata, data->u.dir.dirUsrInfo.frRect.bottom);
  174.       d_storew(&pdata, data->u.dir.dirUsrInfo.frRect.right);
  175.       d_storew(&pdata, data->u.dir.dirUsrInfo.frFlags);
  176.       d_storew(&pdata, data->u.dir.dirUsrInfo.frLocation.v);
  177.       d_storew(&pdata, data->u.dir.dirUsrInfo.frLocation.h);
  178.       d_storew(&pdata, data->u.dir.dirUsrInfo.frView);
  179.  
  180.       d_storew(&pdata, data->u.dir.dirFndrInfo.frScroll.v);
  181.       d_storew(&pdata, data->u.dir.dirFndrInfo.frScroll.h);
  182.       d_storel(&pdata, data->u.dir.dirFndrInfo.frOpenChain);
  183.       d_storew(&pdata, data->u.dir.dirFndrInfo.frUnused);
  184.       d_storew(&pdata, data->u.dir.dirFndrInfo.frComment);
  185.       d_storel(&pdata, data->u.dir.dirFndrInfo.frPutAway);
  186.  
  187.       for (i = 0; i < 4; ++i)
  188.     d_storel(&pdata, data->u.dir.dirResrv[i]);
  189.  
  190.       break;
  191.  
  192.     case cdrFilRec:
  193.       d_storeb(&pdata, data->u.fil.filFlags);
  194.       d_storeb(&pdata, data->u.fil.filTyp);
  195.  
  196.       d_storel(&pdata, data->u.fil.filUsrWds.fdType);
  197.       d_storel(&pdata, data->u.fil.filUsrWds.fdCreator);
  198.       d_storew(&pdata, data->u.fil.filUsrWds.fdFlags);
  199.       d_storew(&pdata, data->u.fil.filUsrWds.fdLocation.v);
  200.       d_storew(&pdata, data->u.fil.filUsrWds.fdLocation.h);
  201.       d_storew(&pdata, data->u.fil.filUsrWds.fdFldr);
  202.  
  203.       d_storel(&pdata, data->u.fil.filFlNum);
  204.  
  205.       d_storew(&pdata, data->u.fil.filStBlk);
  206.       d_storel(&pdata, data->u.fil.filLgLen);
  207.       d_storel(&pdata, data->u.fil.filPyLen);
  208.  
  209.       d_storew(&pdata, data->u.fil.filRStBlk);
  210.       d_storel(&pdata, data->u.fil.filRLgLen);
  211.       d_storel(&pdata, data->u.fil.filRPyLen);
  212.  
  213.       d_storel(&pdata, data->u.fil.filCrDat);
  214.       d_storel(&pdata, data->u.fil.filMdDat);
  215.       d_storel(&pdata, data->u.fil.filBkDat);
  216.  
  217.       d_storew(&pdata, data->u.fil.filFndrInfo.fdIconID);
  218.       for (i = 0; i < 4; ++i)
  219.     d_storew(&pdata, data->u.fil.filFndrInfo.fdUnused[i]);
  220.       d_storew(&pdata, data->u.fil.filFndrInfo.fdComment);
  221.       d_storel(&pdata, data->u.fil.filFndrInfo.fdPutAway);
  222.  
  223.       d_storew(&pdata, data->u.fil.filClpSize);
  224.  
  225.       for (i = 0; i < 3; ++i)
  226.     {
  227.       d_storew(&pdata, data->u.fil.filExtRec[i].xdrStABN);
  228.       d_storew(&pdata, data->u.fil.filExtRec[i].xdrNumABlks);
  229.     }
  230.  
  231.       for (i = 0; i < 3; ++i)
  232.     {
  233.       d_storew(&pdata, data->u.fil.filRExtRec[i].xdrStABN);
  234.       d_storew(&pdata, data->u.fil.filRExtRec[i].xdrNumABlks);
  235.     }
  236.  
  237.       d_storel(&pdata, data->u.fil.filResrv);
  238.       break;
  239.  
  240.     case cdrThdRec:
  241.       for (i = 0; i < 2; ++i)
  242.     d_storel(&pdata, data->u.dthd.thdResrv[i]);
  243.  
  244.       d_storel(&pdata, data->u.dthd.thdParID);
  245.       d_stores(&pdata, data->u.dthd.thdCName, sizeof(data->u.dthd.thdCName));
  246.       break;
  247.  
  248.     case cdrFThdRec:
  249.       for (i = 0; i < 2; ++i)
  250.     d_storel(&pdata, data->u.fthd.fthdResrv[i]);
  251.  
  252.       d_storel(&pdata, data->u.fthd.fthdParID);
  253.       d_stores(&pdata, data->u.fthd.fthdCName, sizeof(data->u.fthd.fthdCName));
  254.       break;
  255.  
  256.     default:
  257.       abort();
  258.     }
  259.  
  260.   if (len)
  261.     *len += pdata - start;
  262. }
  263.  
  264. /*
  265.  * NAME:    record->unpackcatdata()
  266.  * DESCRIPTION:    unpack catalog record data
  267.  */
  268. void r_unpackcatdata(pdata, data)
  269.     unsigned char    *pdata;
  270.     CatDataRec    *data;
  271. {
  272.   int i;
  273.  
  274.   d_fetchb(&pdata, (char *) &data->cdrType);
  275.   d_fetchb(&pdata, (char *) &data->cdrResrv2);
  276.  
  277.   switch (data->cdrType)
  278.     {
  279.     case cdrDirRec:
  280.       d_fetchw(&pdata, &data->u.dir.dirFlags);
  281.       d_fetchw(&pdata, (short *) &data->u.dir.dirVal);
  282.       d_fetchl(&pdata, (long *) &data->u.dir.dirDirID);
  283.       d_fetchl(&pdata, &data->u.dir.dirCrDat);
  284.       d_fetchl(&pdata, &data->u.dir.dirMdDat);
  285.       d_fetchl(&pdata, &data->u.dir.dirBkDat);
  286.  
  287.       d_fetchw(&pdata, &data->u.dir.dirUsrInfo.frRect.top);
  288.       d_fetchw(&pdata, &data->u.dir.dirUsrInfo.frRect.left);
  289.       d_fetchw(&pdata, &data->u.dir.dirUsrInfo.frRect.bottom);
  290.       d_fetchw(&pdata, &data->u.dir.dirUsrInfo.frRect.right);
  291.       d_fetchw(&pdata, &data->u.dir.dirUsrInfo.frFlags);
  292.       d_fetchw(&pdata, &data->u.dir.dirUsrInfo.frLocation.v);
  293.       d_fetchw(&pdata, &data->u.dir.dirUsrInfo.frLocation.h);
  294.       d_fetchw(&pdata, &data->u.dir.dirUsrInfo.frView);
  295.  
  296.       d_fetchw(&pdata, &data->u.dir.dirFndrInfo.frScroll.v);
  297.       d_fetchw(&pdata, &data->u.dir.dirFndrInfo.frScroll.h);
  298.       d_fetchl(&pdata, &data->u.dir.dirFndrInfo.frOpenChain);
  299.       d_fetchw(&pdata, &data->u.dir.dirFndrInfo.frUnused);
  300.       d_fetchw(&pdata, &data->u.dir.dirFndrInfo.frComment);
  301.       d_fetchl(&pdata, &data->u.dir.dirFndrInfo.frPutAway);
  302.  
  303.       for (i = 0; i < 4; ++i)
  304.     d_fetchl(&pdata, &data->u.dir.dirResrv[i]);
  305.  
  306.       break;
  307.  
  308.     case cdrFilRec:
  309.       d_fetchb(&pdata, (char *) &data->u.fil.filFlags);
  310.       d_fetchb(&pdata, (char *) &data->u.fil.filTyp);
  311.  
  312.       d_fetchl(&pdata, &data->u.fil.filUsrWds.fdType);
  313.       d_fetchl(&pdata, &data->u.fil.filUsrWds.fdCreator);
  314.       d_fetchw(&pdata, &data->u.fil.filUsrWds.fdFlags);
  315.       d_fetchw(&pdata, &data->u.fil.filUsrWds.fdLocation.v);
  316.       d_fetchw(&pdata, &data->u.fil.filUsrWds.fdLocation.h);
  317.       d_fetchw(&pdata, &data->u.fil.filUsrWds.fdFldr);
  318.  
  319.       d_fetchl(&pdata, (long *) &data->u.fil.filFlNum);
  320.  
  321.       d_fetchw(&pdata, (short *) &data->u.fil.filStBlk);
  322.       d_fetchl(&pdata, (long *) &data->u.fil.filLgLen);
  323.       d_fetchl(&pdata, (long *) &data->u.fil.filPyLen);
  324.  
  325.       d_fetchw(&pdata, (short *) &data->u.fil.filRStBlk);
  326.       d_fetchl(&pdata, (long *) &data->u.fil.filRLgLen);
  327.       d_fetchl(&pdata, (long *) &data->u.fil.filRPyLen);
  328.  
  329.       d_fetchl(&pdata, &data->u.fil.filCrDat);
  330.       d_fetchl(&pdata, &data->u.fil.filMdDat);
  331.       d_fetchl(&pdata, &data->u.fil.filBkDat);
  332.  
  333.       d_fetchw(&pdata, &data->u.fil.filFndrInfo.fdIconID);
  334.       for (i = 0; i < 4; ++i)
  335.     d_fetchw(&pdata, &data->u.fil.filFndrInfo.fdUnused[i]);
  336.       d_fetchw(&pdata, &data->u.fil.filFndrInfo.fdComment);
  337.       d_fetchl(&pdata, &data->u.fil.filFndrInfo.fdPutAway);
  338.  
  339.       d_fetchw(&pdata, (short *) &data->u.fil.filClpSize);
  340.  
  341.       for (i = 0; i < 3; ++i)
  342.     {
  343.       d_fetchw(&pdata, (short *) &data->u.fil.filExtRec[i].xdrStABN);
  344.       d_fetchw(&pdata, (short *) &data->u.fil.filExtRec[i].xdrNumABlks);
  345.     }
  346.  
  347.       for (i = 0; i < 3; ++i)
  348.     {
  349.       d_fetchw(&pdata, (short *) &data->u.fil.filRExtRec[i].xdrStABN);
  350.       d_fetchw(&pdata, (short *) &data->u.fil.filRExtRec[i].xdrNumABlks);
  351.     }
  352.  
  353.       d_fetchl(&pdata, &data->u.fil.filResrv);
  354.       break;
  355.  
  356.     case cdrThdRec:
  357.       for (i = 0; i < 2; ++i)
  358.     d_fetchl(&pdata, &data->u.dthd.thdResrv[i]);
  359.  
  360.       d_fetchl(&pdata, (long *) &data->u.dthd.thdParID);
  361.       d_fetchs(&pdata, data->u.dthd.thdCName, sizeof(data->u.dthd.thdCName));
  362.       break;
  363.  
  364.     case cdrFThdRec:
  365.       for (i = 0; i < 2; ++i)
  366.     d_fetchl(&pdata, &data->u.fthd.fthdResrv[i]);
  367.  
  368.       d_fetchl(&pdata, (long *) &data->u.fthd.fthdParID);
  369.       d_fetchs(&pdata, data->u.fthd.fthdCName, sizeof(data->u.fthd.fthdCName));
  370.       break;
  371.  
  372.     default:
  373.       abort();
  374.     }
  375. }
  376.  
  377. /*
  378.  * NAME:    record->packextdata()
  379.  * DESCRIPTION:    pack extent record data
  380.  */
  381. void r_packextdata(data, pdata, len)
  382.     ExtDataRec    *data;
  383.     unsigned char    *pdata;
  384.     int        *len;
  385. {
  386.   unsigned char *start = pdata;
  387.   int i;
  388.  
  389.   for (i = 0; i < 3; ++i)
  390.     {
  391.       d_storew(&pdata, (*data)[i].xdrStABN);
  392.       d_storew(&pdata, (*data)[i].xdrNumABlks);
  393.     }
  394.  
  395.   if (len)
  396.     *len += pdata - start;
  397. }
  398.  
  399. /*
  400.  * NAME:    record->unpackextdata()
  401.  * DESCRIPTION:    unpack extent record data
  402.  */
  403. void r_unpackextdata(pdata, data)
  404.     unsigned char    *pdata;
  405.     ExtDataRec    *data;
  406. {
  407.   int i;
  408.  
  409.   for (i = 0; i < 3; ++i)
  410.     {
  411.       d_fetchw(&pdata, (short *) &(*data)[i].xdrStABN);
  412.       d_fetchw(&pdata, (short *) &(*data)[i].xdrNumABlks);
  413.     }
  414. }
  415.  
  416. /*
  417.  * NAME:    record->makecatkey()
  418.  * DESCRIPTION:    construct a catalog record key
  419.  */
  420. void r_makecatkey(key, parid, name)
  421.     CatKeyRec    *key;
  422.     long        parid;
  423.     char        *name;
  424. {
  425.   int len;
  426.  
  427.   len = strlen(name) + 1;
  428.  
  429.   key->ckrKeyLen = 0x05 + len + (len & 1);
  430.   key->ckrResrv1 = 0;
  431.   key->ckrParID  = parid;
  432.  
  433.   strcpy(key->ckrCName, name);
  434. }
  435.  
  436. /*
  437.  * NAME:    record->makeextkey()
  438.  * DESCRIPTION:    construct an extents record key
  439.  */
  440. void r_makeextkey(key, ffork, fnum, fabn)
  441.     ExtKeyRec    *key;
  442.     int        ffork;
  443.     long        fnum;
  444.     unsigned int    fabn;
  445. {
  446.   key->xkrKeyLen = 0x07;
  447.   key->xkrFkType = ffork;
  448.   key->xkrFNum   = fnum;
  449.   key->xkrFABN   = fabn;
  450. }
  451.  
  452. /*
  453.  * NAME:    record->unpackdirent()
  454.  * DESCRIPTION:    unpack catalog information into hfsdirent structure
  455.  *
  456.  * Taken fron v3.2.6
  457.  */
  458. void r_unpackdirent(parid, name, data, ent)
  459.     long        parid;
  460.     char        *name;
  461.     CatDataRec    *data;
  462.     hfsdirent    *ent;
  463. {
  464.   strcpy(ent->name, name);
  465.   ent->parid = parid;
  466.  
  467.   switch (data->cdrType)
  468.     {
  469.     case cdrDirRec:
  470.       ent->flags = HFS_ISDIR;
  471.       ent->cnid  = data->u.dir.dirDirID;
  472.  
  473.       ent->crdate = d_toutime(data->u.dir.dirCrDat);
  474.       ent->mddate = d_toutime(data->u.dir.dirMdDat);
  475.       ent->bkdate = d_toutime(data->u.dir.dirBkDat);
  476.  
  477.       ent->fdflags      = data->u.dir.dirUsrInfo.frFlags;
  478.       ent->fdlocation.v = data->u.dir.dirUsrInfo.frLocation.v;
  479.       ent->fdlocation.h = data->u.dir.dirUsrInfo.frLocation.h;
  480.  
  481.       ent->u.dir.valence = data->u.dir.dirVal;
  482.  
  483.       ent->u.dir.rect.top    = data->u.dir.dirUsrInfo.frRect.top;
  484.       ent->u.dir.rect.left   = data->u.dir.dirUsrInfo.frRect.left;
  485.       ent->u.dir.rect.bottom = data->u.dir.dirUsrInfo.frRect.bottom;
  486.       ent->u.dir.rect.right  = data->u.dir.dirUsrInfo.frRect.right;
  487.  
  488.       /* mkhybrid extra */
  489.       ent->u.dir.frscroll.v  = data->u.dir.dirFndrInfo.frScroll.v;
  490.       ent->u.dir.frscroll.h  = data->u.dir.dirFndrInfo.frScroll.h;
  491.       ent->u.dir.view         = data->u.dir.dirUsrInfo.frView;
  492.  
  493.       break;
  494.  
  495.     case cdrFilRec:
  496.       ent->flags = (data->u.fil.filFlags & (1 << 0)) ? HFS_ISLOCKED : 0;
  497.       ent->cnid  = data->u.fil.filFlNum;
  498.  
  499.       ent->crdate = d_toutime(data->u.fil.filCrDat);
  500.       ent->mddate = d_toutime(data->u.fil.filMdDat);
  501.       ent->bkdate = d_toutime(data->u.fil.filBkDat);
  502.  
  503.       ent->fdflags      = data->u.fil.filUsrWds.fdFlags;
  504.       ent->fdlocation.v = data->u.fil.filUsrWds.fdLocation.v;
  505.       ent->fdlocation.h = data->u.fil.filUsrWds.fdLocation.h;
  506.  
  507.       ent->u.file.dsize = data->u.fil.filLgLen;
  508.       ent->u.file.rsize = data->u.fil.filRLgLen;
  509.  
  510.       d_putl((unsigned char *) ent->u.file.type,
  511.           data->u.fil.filUsrWds.fdType);
  512.       d_putl((unsigned char *) ent->u.file.creator,
  513.          data->u.fil.filUsrWds.fdCreator);
  514.  
  515.       ent->u.file.type[4] = ent->u.file.creator[4] = 0;
  516.  
  517.       break;
  518.     }
  519. }
  520.  
  521. /*
  522.  * NAME:    record->packdirent()
  523.  * DESCRIPTION:    make changes to a catalog record
  524.  *
  525.  * Taken fron v3.2.6
  526.  */
  527. void r_packdirent(data, ent)
  528.     CatDataRec    *data;
  529.     hfsdirent    *ent;
  530. {
  531.   switch (data->cdrType)
  532.     {
  533.     case cdrDirRec:
  534.       data->u.dir.dirCrDat = d_tomtime(ent->crdate);
  535.       data->u.dir.dirMdDat = d_tomtime(ent->mddate);
  536.       data->u.dir.dirBkDat = d_tomtime(ent->bkdate);
  537.  
  538.       data->u.dir.dirUsrInfo.frFlags      = ent->fdflags;
  539.       data->u.dir.dirUsrInfo.frLocation.v = ent->fdlocation.v;
  540.       data->u.dir.dirUsrInfo.frLocation.h = ent->fdlocation.h;
  541.  
  542.       data->u.dir.dirUsrInfo.frRect.top    = ent->u.dir.rect.top;
  543.       data->u.dir.dirUsrInfo.frRect.left   = ent->u.dir.rect.left;
  544.       data->u.dir.dirUsrInfo.frRect.bottom = ent->u.dir.rect.bottom;
  545.       data->u.dir.dirUsrInfo.frRect.right  = ent->u.dir.rect.right;
  546.  
  547.       /* mkhybrid extra */
  548.       data->u.dir.dirFndrInfo.frScroll.v   = ent->u.dir.frscroll.v;
  549.       data->u.dir.dirFndrInfo.frScroll.h   = ent->u.dir.frscroll.h;
  550.       data->u.dir.dirUsrInfo.frView       = ent->u.dir.view;
  551.  
  552.       break;
  553.  
  554.     case cdrFilRec:
  555.       if (ent->flags & HFS_ISLOCKED)
  556.     data->u.fil.filFlags |=  (1 << 0);
  557.       else
  558.     data->u.fil.filFlags &= ~(1 << 0);
  559.  
  560.       data->u.fil.filCrDat = d_tomtime(ent->crdate);
  561.       data->u.fil.filMdDat = d_tomtime(ent->mddate);
  562.       data->u.fil.filBkDat = d_tomtime(ent->bkdate);
  563.  
  564.       data->u.fil.filUsrWds.fdFlags      = ent->fdflags;
  565.       data->u.fil.filUsrWds.fdLocation.v = ent->fdlocation.v;
  566.       data->u.fil.filUsrWds.fdLocation.h = ent->fdlocation.h;
  567.  
  568.       data->u.fil.filUsrWds.fdType =
  569.     d_getl((unsigned char *) ent->u.file.type);
  570.       data->u.fil.filUsrWds.fdCreator =
  571.     d_getl((unsigned char *) ent->u.file.creator);
  572.  
  573.       break;
  574.     }
  575. }
  576.